package wechat

import (
	"encoding/json"
	"fmt"
	"gitee.com/fbbi/go-wechat/util"
)

const (
	//草稿列表
	WXAPIDraftBatchget = "draft/batchget?access_token=%s"
	//新增草稿
	WXAPIDraftAdd = "draft/add?access_token=%s"
	//删除草稿
	WXAPIDraftDelete = "draft/delete?access_token=%s"
	//更新草稿
	WXAPIDraftUpdate = "draft/update?access_token=%s"
	// 获取草稿详情
	WXAPIDraftGet = "draft/get?access_token=%s"
)

// /图文消息
type DraftArticleItem struct {
	ArticleType        string `json:"article_type"`          //文章类型，分别有图文消息（news）、图片消息（newspic），不填默认为图文消息（news）
	Title              string `json:"title"`                 //标题
	Author             string `json:"author"`                //作者
	Digest             string `json:"digest"`                //图文消息的摘要，仅有单图文消息才有摘要，多图文此处为空。如果本字段为没有填写，则默认抓取正文前54个字。
	Content            string `json:"content"`               //图文消息的具体内容，支持HTML标签，必须少于2万字符，小于1M，且此处会去除JS,涉及图片url必须来源 "上传图文消息内的图片获取URL"接口获取。外部图片url将被过滤。 图片消息则仅支持纯文本和部分特殊功能标签如商品，商品个数不可超过50个
	ContentSourceUrl   string `json:"content_source_url"`    //图文消息的原文地址，即点击“阅读原文”后的URL
	ThumbMediaId       string `json:"thumb_media_id"`        // 图文消息的封面图片素材id（必须是永久MediaID）
	NeedOpenComment    int    `json:"need_open_comment"`     //是否打开评论，0不打开(默认)，1打开
	OnlyFansCanComment int    `json:"only_fans_can_comment"` //是否粉丝才可评论，0所有人可评论(默认)，1粉丝才可评论
	ThumbUrl           string `json:"thumb_url"`             //图文消息的封面URL
	Url                string `json:"url"`                   //预览地址
}

type DraftArticle struct {
	Articles []DraftArticleItem `json:"articles"`
	MediaId  string             `json:"media_id"` // 修改草稿时使用
	Index    int                `json:"index"`    //要更新的文章在图文消息中的位置（多图文消息时，此字段才有意义），第一篇为0
}
type DraftArticleItemResp struct {
	CreateTime uint               `json:"create_time"` //总条数
	UpdateTime uint               `json:"update_time"` //更新时间戳
	NewsItem   []DraftArticleItem `json:"news_item"`
}
type DraftArticleResp struct {
	MediaId    string               `json:"media_id"`
	Content    DraftArticleItemResp `json:"content"`
	UpdateTime int                  `json:"update_time"` //更新时间戳
}

// 草稿列表请求结构
type DraftBatchgetReq struct {
	Offset    int `json:"offset"`     //从全部素材的该偏移位置开始返回，0表示从第一个素材 返回
	Count     int `json:"count"`      //返回素材的数量，取值在1到20之间
	NoContent int `json:"no_content"` //1 表示不返回 content 字段，0 表示正常返回，默认为 0
}

// 获取草稿列表返回结果
type DraftBatchgetResp struct {
	TotalCount int                `json:"total_count"` //总条数
	ItemCount  int                `json:"item_count"`  //返回条数
	Item       []DraftArticleResp `json:"item"`
}

// 获取列表
func (s *Server) GetDraftPageList(req DraftBatchgetReq) (m *DraftBatchgetResp, err error) {
	m = new(DraftBatchgetResp)
	url := fmt.Sprintf(s.RootUrl+WXAPIDraftBatchget, s.GetAccessToken())
	responseBytes, err := util.PostJson(url, req)
	if err != nil {
		return nil, err
	}
	err = json.Unmarshal(responseBytes, &m)
	if err != nil {
		return nil, err
	}

	return m, nil
}

// 新增草稿
func (s *Server) AddDraft(articles DraftArticle) (mediaID string, err error) {
	url := fmt.Sprintf(s.RootUrl+WXAPIDraftAdd, s.GetAccessToken())
	responseBytes, err := util.PostJson(url, articles)
	if err != nil {
		return
	}
	var res resArticles
	err = json.Unmarshal(responseBytes, &res)
	if err != nil {
		return
	}
	if res.ErrCode != 0 {
		return "", fmt.Errorf("errcode=%d,errmsg=%s", res.ErrCode, res.ErrMsg)
	}
	mediaID = res.MediaID
	return
}

// 删除草稿
func (s *Server) DeleteDraft(mediaID string) error {
	url := fmt.Sprintf(s.RootUrl+WXAPIDraftDelete, s.GetAccessToken())

	_, err := util.PostJson(url, reqDeleteMaterial{mediaID})
	if err != nil {
		return err
	}
	return err
}

// 编辑草稿
func (s *Server) UpdateDraft(article DraftArticle) (err error) {
	url := fmt.Sprintf(s.RootUrl+WXAPIDraftAdd, s.GetAccessToken())
	responseBytes, err := util.PostJson(url, article)
	if err != nil {
		return
	}
	var res resArticles
	err = json.Unmarshal(responseBytes, &res)
	if err != nil {
		return
	}
	if res.ErrCode != 0 {
		return fmt.Errorf("errcode=%d,errmsg=%s", res.ErrCode, res.ErrMsg)
	}
	return
}
